package com.yuanfeng.action.front.user.web;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.yuanfeng.action.front.user.service.IUserService;
import com.yuanfeng.pojo.Users;
import com.yuanfeng.util.MD5Util;
import com.yuanfeng.util.WebUtil;
import org.apache.struts2.ServletActionContext;
import javax.mail.Authenticator;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;
import java.util.Properties;

/**
 * 用户模块
 * 使用struts2的模型驱动
 */
public class UserAction extends ActionSupport implements ModelDriven<Users> {

    private  Users user = new Users();//因为使用了modeldrivenn
    /**
     * 注入
     */
    private IUserService userServiceImpl;

    public void setUserServiceImpl(IUserService userServiceImpl) {
        this.userServiceImpl = userServiceImpl;
    }

    /**
     * 登陆
     * @param
     * @throws
     * @throws
     */
    public String login() throws Exception {
     	// 验证用户名
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();
        // 获取用户输入的验证码
        String code = request.getParameter("sCode");// 先验证验证码
        // 获取生成的验证码
        String sCode = (String) request.getSession().getAttribute("sCode");
        if(code == null)
            return ERROR;
        if (code.trim().equals(sCode)){
            // 去验证用户名是否正确
            // 得到modelDriven
            user = this.getModel();
            System.out.println(user.getName());
            List<Users> users = userServiceImpl.login(user.getName());
            Users loginUser = null;
            if (users.size() >= 0) {
                loginUser = users.get(0);
                System.out.println(loginUser);
            }
            if (loginUser != null) {
                // 验证密码
                if (MD5Util.md5(user.getPassword()).equals(loginUser.getPassword())) {
                    // 登录成功
                    // 将用户信息放到session中
                    request.getSession().setAttribute("user", loginUser);
                    // 转到IndexServlet页面执行对应的方法
                    System.out.println("登陆成功");
                    return SUCCESS;
                } else {
                    // 密码错误
                    request.setAttribute("msg", "密码输入有误");
                    request.getRequestDispatcher("/jsp/front/shopIndex.jsp").forward(request, response);
                    return ERROR;
                }
            } else {
                // 用户名不存在
                request.setAttribute("msg", "用户名不存在");
                request.getRequestDispatcher("/jsp/front/shopIndex.jsp").forward(request, response);
                return ERROR;
            }
        } else {
            // 验证码错误
            request.setAttribute("msg", "验证码错误");
            request.getRequestDispatcher("/jsp/front/shopIndex.jsp").forward(request, response);
            return ERROR;
        }
        }
    /**
     * 用户登出
     *
     * @return
     * @throws Exception
     */
    public String exit() throws Exception {
        //得到request
        HttpServletRequest request = ServletActionContext.getRequest();
        // 域对象中得到用户的信息删除
        System.out.println("用户登出");
        request.getSession().removeAttribute("user");
        return "exit";
    }

    /**
     * 用户注册
     *
     * @return
     */
    public String register() throws Exception {
        System.out.println("用户注册");
        //得到request
        HttpServletRequest request = ServletActionContext.getRequest();
        // 拷贝数据
        user = this.getModel();
        System.out.println(user.getName());
        user.setRegtime(new Date());
        user.setValidatecode(WebUtil.uuid());
        // 保存
        userServiceImpl.reg(user);
        //3)使用线程发送激活邮件
        //启动线程
        new MySendMailThread(user).start();
        request.getSession().setAttribute("success", "success");
        // 跳转到注册成功页面
        return "register";
    }

    /**
     * 查看用户信息
     *
     * @return
     * @throws Exception
     */
    public String info() throws Exception {
        HttpServletRequest request = ServletActionContext.getRequest();
        Users userInfo = (Users) request.getSession().getAttribute("user");
        request.getSession().setAttribute("user", userInfo);
        return "info";
    }
    /**
     * 得到用户
     * @return
     */
    @Override
    public Users getModel() {
        return user;
    }

    /**
     * 使用线程发送邮件
     */
    class MySendMailThread extends Thread {

        private Users user;

        public MySendMailThread(Users user) {
            this.user = user;
        }

        @Override
        public void run() {
            try {
                //1)创建一个Session对象,连接和登录服务器
                /**
                 * 参数一： 本次连接的配置。
                 * 参数二： 返回对用户名和密码base64加密的对象
                 */
                Properties props = new Properties();
                //1.1连接的发邮件的服务器地址
                props.setProperty("mail.host", "smtp.163.com");
                //1.2 指定进行验证登录
                props.setProperty("mail.smtp.auth", "true");

                Session session = Session.getDefaultInstance(props, new Authenticator() {
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication("yjxsy1996@163.com", "yjxsy1996");
                    }
                });
                //打开调用
                session.setDebug(true);

                //2)在本次连接上， 创建一封邮件
                MimeMessage mail = new MimeMessage(session);

                //3）设置邮件内容
                ///3.1 设置发件人
                mail.setFrom(new InternetAddress("yjxsy1996@163.com"));

                //3.2 设置收件人
                /**
                 * 参数一： 发送方法
                 * 		发送： TO    A->B
                 *      抄送： CC    A->B  C
                 *      密送： BCC   A->B  C
                 *  参数二： 发送的地址
                 */
                mail.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail()));

                //3.3 设置主题
                mail.setSubject("激活邮件-Alone在线购书商城注册邮件");

                String html = "亲爱的" + user.getName() + "用户:<br/>&nbsp;&nbsp;恭喜你成为Alone在线购书商城的会员，请于48小时内使用以下链接激活你的用户。<br/>";

                html += "<a href='active_activeUser.action?email=" + user.getEmail() + "&code=" + user.getValidatecode() + "'>激活链接</a>";

                //3.4 设置内容
                /**
                 * 参数二： 邮件的内容格式。如 普通文本，html方式
                 */
                mail.setContent(html, "text/html;charset=utf-8");

                //4)发送邮件
                Transport.send(mail);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}
